import default from "./interface";

//定时器模块

class Timer {
    //end截至时间
    //时间更新的回调
    //handle是倒计时结束以后的回调
    countdown(end, update, handle) {
        //先取当前时间(gettime()就是获取时间戳的毫秒数)
        const now = new Date().getTime();
        //获取当前对象(实例)的指针
        const self = this;

        //如果当前时间大于截止时间,说明倒计时已经结束了
        //因为时间戳是往前走的
        if ((now - end) >= 0) {
            //执行倒计时已经结束的回调
            handle.call(self);
        } else {
            //如果没有结束,我们来判断剩余时间
            let last_time = end - now;
            //来识别一天是多少毫秒
            const px_d=1000*60*60*24;
            const px_h=1000*60*60;
            const px_m=1000*60;
            const px_s=1000;

            //Math.floor()对一个数进行下舍入
            //如果说时间戳大于一天的话,那么整数部分至少为1
            //(如果不大于一天的话,那么都是0.xxxxx了,Math.floor()就是0了)
            //这种方法还是比较聪明的
            let d=Math.floor(last_time/px_d);

            //注意看这里,再计算剩余的小时的时候
            //乘上了之前的的剩余天数(如果剩余天数为0的话,这个值就没有了)
            //感觉这种做法很聪明,我自己就是想不出来
            let h=Math.floor((last_time-d*px_d)/px_h);
            //剩余的分钟数
            let m=Math.floor((last_time-d*px_d-h*px_h)/px_h);
            //剩余的秒数
            let s=Math.floor((last_time-d*px_d-h*px_h-m*px_m)/px_s);

            //把值保存到一个数组当中
            let r=[];

            if(d>0){
                r.push(`<em>${d}</em>天`);
            }
            //为什么会有r.length这样的判断呢?
            //这个是为了判断 例如 1天0时59分钟,如果没有length的话
            //就是1天59分钟了,可能会令人误解
            //所以说要考虑的到这种情况,有length的话,就说明前面是有数的(数据)
            //所以也要加上来计算
            if(r.length||(h>0)){
                r.push(`<em>${h}</em>时`)
            }
            if(r.length||(m>0)){
                r.push(`<em>${h}</em>分`)
            }
            if(r.length||(s>0)){
                r.push(`<em>${h}</em>秒`)
            }

            //将值保存到一个属性当中
            self.last_time=r.join('');
            //调用回调函数update
            //为什么要绑定call呢
            //因为update这个函数是在别的地方声明的
            //而且是在函数体当中调用的this就会指向全局(具体看情况)
            update.call(self,r.join(''));

            //设置时间继续轮询
            //不用担心settimeout()会无限执行,
            // 因为这个是在else(也就是有条件的情况下执行的)
            setTimeout(function () {
                self.countdown(end,update,handle)
            },100)

        }

    }


}

export default Timer;

























